Integrantes
Apellido, Nombre Código Correo Electronico Alvarado Vargas, Fabian 201910354 fabian.alvarado@utec.edu.pe Murga Díaz, Nathalie 202110238 nathalie.murga@utec.edu.pe Flores Soto, Ronaldo Dylan 202110122 ronaldo.flores@iutec.edu.pe Vilcarromero Moscoso, Rodo Arturo 202010431 rodo.vilcarromero@utec.edu.pe Hilario Quintana, Jeffry 202020082 jeffry.hilario@utec.edu.pe
Introducción
La moda es una industria global en constante evolución y uno de los mayores impulsores del comercio internacional. Los consumidores buscan constantemente nuevas tendencias y estilos únicos, lo que hace que la industria de la moda sea altamente competitiva. Para ayudar a los minoristas a mantenerse al día con las últimas tendencias y preferencias de los consumidores, se están desarrollando nuevas herramientas de análisis de datos y motores de búsqueda para la moda.
Relevancia y Justificación:
En este contexto, el desarrollo de un gestor de motor de búsqueda para la elaboración de recomendaciones sobre las preferencias de la ropa de moda en la India se vuelve crucial para mejorar la capacidad de las empresas de este sector para ofrecer productos más acordes a las necesidades y gustos de los consumidores. Además, este tipo de herramientas tecnológicas permiten recopilar grandes cantidades de datos sobre las preferencias de los consumidores de manera eficiente, lo que es vital para mejorar la eficacia y eficiencia de la toma de decisiones empresariales.
Objetivos:
Objetivo Principal:
Nuestro objetivo de este trabajo es presentar un gestor de motor de búsqueda para elaborar recomendaciones sobre las preferencias de la ropa de moda en la India. Para ello, se analizará una base de datos que incluye información sobre los gustos y preferencias de los consumidores en cuanto a diferentes tipos de prendas y estilos de moda.
Objetivos Secundarios
A partir de esta información, se desarrollará un modelo de recomendación que permita a las empresas del sector ofrecer productos más acordes a las necesidades y gustos de los consumidores, contribuyendo así a mejorar su competitividad y su capacidad de satisfacer las demandas del mercado.
Datos
Recolección de datos
Se ha seleccionado la data de una base de datos de Kaggle con el nombre “Fashion Clothing Products Dataset” el cual presenta una población de 10000 valores. La base de datos se origina en Myntra.com, Myntra es una importante empresa india de comercio electrónico de moda con sede en Bengaluru, Karnataka, India. La empresa se fundó en 2007 para vender artículos de regalo personalizados. En mayo de 2014 , FlipKart adquirió Myntra.com.
Empezaremos cargando nuestra base de datos
library(readr)
## Warning: package 'readr' was built under R version 4.2.3
library(dplyr)
library(modeest)
## Warning: package 'modeest' was built under R version 4.2.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
library(plotrix)
dataframe<-read_csv("myntra_products_catalog.csv")
dataframe
Población Objetivo
Seleccionaremos una muestra de 1000 variables para poder cumplir nuestros objetivos y poder responder de manera adecuada cada pregunta usando los análisis y limpieza de los datos que hemos aprendido a lo largo de este curso.
A continuación seleccionaremos nuestra muestra
dataMuestra<-dataframe[1:1000,]
dataMuestra
y continuaremos con nuestro estudio en base a esta
Variables de estudio iniciales
Para la base de datos presentamos las siguientes variables:
| Nombre de variable | Tipo de variable | Descripción |
|---|---|---|
| ProductoId | cualitativa | Es nuestra llave primaria para cada producto, única en toda la base de datos |
| NombreProducto | cualitativa | El nombre del producto |
| MarcaProducto | cualitativa | La marca que fabrica el producto |
| Género | cualitativa | El género el cual esta destinado para el producto |
| PrecioUSD | cuantitativa | El precio en Rupias(INR) convertido a dolares estadounidenses(USD) |
| NumImagenes | cuantitativa | Cantidad de imágenes que hay para el producto |
| Descripción | cualitativa | Una pequeña descripción sobre el producto |
| ColorPrimario | cualitativa | Color del producto |
Actualizamos el nombre de nuestras columnas para una mejor visualización de nuestro estudio
colnames(dataMuestra)
## [1] "ProductID" "ProductName" "ProductBrand" "Gender" "Price (INR)"
## [6] "NumImages" "Description" "PrimaryColor"
colnames(dataMuestra)<-c("ProductoId","NombreProducto","MarcaProducto","Genero","PrecioUSD","NumImagenes","Descripción","ColorPrimario")
Ahora nuestras columnas se llamaran
colnames(dataMuestra)
## [1] "ProductoId" "NombreProducto" "MarcaProducto" "Genero"
## [5] "PrecioUSD" "NumImagenes" "Descripción" "ColorPrimario"
Control de los Na en las variables
any(is.na(dataMuestra$ProductoId))
## [1] FALSE
any(is.na(dataMuestra$NombreProducto))
## [1] FALSE
any(is.na(dataMuestra$MarcaProducto))
## [1] FALSE
any(is.na(dataMuestra$Genero))
## [1] FALSE
any(is.na(dataMuestra$PrecioUSD))
## [1] FALSE
any(is.na(dataMuestra$NumImagenes))
## [1] FALSE
any(is.na(dataMuestra$Descripción))
## [1] FALSE
any(is.na(dataMuestra$ColorPrimario))
## [1] TRUE
Detectamos que color primario cuenta con valores Na entonces procedemos a corregirlo
dataMuestra$ColorPrimario[is.na(dataMuestra$ColorPrimario)]<-"No color"
any(is.na(dataMuestra$ColorPrimario))
## [1] FALSE
Convertimos la rupia del Precio del producto a dolares estadounidenses
dataMuestra$PrecioUSD<-dataMuestra$PrecioUSD*0.012
dataMuestra$PrecioUSD[1:10]
## [1] 140.940 69.720 10.788 67.188 9.108 9.492 8.628 10.788 7.968
## [10] 208.320
La moda de los productos.
getmode <- function(mod) {
uniqv <- unique(mod)
uniqv[which.max(tabulate(match(mod, uniqv)))]
}
modNombreProducto <- dataMuestra$NombreProducto
result <- getmode(modNombreProducto)
print(result)
## [1] "Parx Men Blue Slim Fit Checked Casual Shirt"
#OTRA FORMA
mfv(dataMuestra$NombreProducto,method="mlv")
## [1] "Parx Men Blue Slim Fit Checked Casual Shirt"
tablaNombreProducto<-table(modNombreProducto)
maxNombreProducto<-max(tablaNombreProducto)
print(maxNombreProducto)
## [1] 16
# Convertir la tabla en un dataframe
tabla_df <- as.data.frame(tablaNombreProducto)
# Acceder al conteo
conteo <- tabla_df$Freq
# Definir el valor umbral para cambiar el color de la barra
ggplot(tabla_df,aes(x=tabla_df$modNombreProducto,y=tabla_df$Freq)) +
geom_bar(stat = "identity", fill = ifelse(conteo == maxNombreProducto, "green", "blue")) +
labs(x = "Nombre Producto", y = "Cant. Apariciones") +
ggtitle("Gráfico de barras - NombreProducto") +
theme_minimal()
## Warning: Use of `tabla_df$modNombreProducto` is discouraged.
## ℹ Use `modNombreProducto` instead.
## Warning: Use of `tabla_df$Freq` is discouraged.
## ℹ Use `Freq` instead.
ProductosPreferidos<-dataMuestra %>%
filter(dataMuestra$NombreProducto==result)
precios<- as.data.frame(table(ProductosPreferidos$PrecioUSD))
colores<-as.data.frame(table(ProductosPreferidos$ColorPrimario))
sexos<-as.data.frame(table(ProductosPreferidos$Genero))
EXPLICACIÓN:
Podemos observar en mediante este gráfico de barras que el nombre que más pedido en MYNTRA es “Parx Men Blue Slim Fit Checked Casual Shirt” con un total de 16 veces pedido. Además de que su rango de precios es entre:
range(as.double(as.character(precios$Var1)))
## [1] 8.148 11.268
print(colores$Var1)
## [1] Blue
## Levels: Blue
print(sexos$Var1)
## [1] Men
## Levels: Men
Podemos concluir que los hombres, que compran “Parx Men Blue Slim Fit Checked Casual Shirt” a un precio entre 8.148 y 11.268 les gusta el color azul.
La moda de la marca del producto
getmode <- function(mod) {
uniqv <- unique(mod)
uniqv[which.max(tabulate(match(mod, uniqv)))]
}
mod <- dataMuestra$MarcaProducto
result <- getmode(mod)
print(result)
## [1] "Parx"
tablaMarca<-table(dataMuestra$MarcaProducto)
maxMarca<-max(table(dataMuestra$MarcaProducto))
print(maxMarca)
## [1] 112
# Convertir la tabla en un dataframe
tabla_df <- as.data.frame(tablaMarca)
# Acceder al conteo
conteo <- tabla_df$Freq
# Definir el valor umbral para cambiar el color de la barra
ggplot(tabla_df,aes(x=tabla_df$Var1,y=tabla_df$Freq)) +
geom_bar(stat = "identity", fill = ifelse(conteo == maxMarca, "green", "blue")) +
labs(x = "Marca Producto", y = "Cant. Apariciones") +
#ggline(promedioMarca ~range())
ggtitle("Gráfico de barras - MarcaProducto") +
theme_minimal()
## Warning: Use of `tabla_df$Var1` is discouraged.
## ℹ Use `Var1` instead.
## Warning: Use of `tabla_df$Freq` is discouraged.
## ℹ Use `Freq` instead.
MarcaPreferida<-dataMuestra%>%
filter(dataMuestra$MarcaProducto==result)
precio<-as.data.frame(table(MarcaPreferida$PrecioUSD))
color<-as.data.frame(table(MarcaPreferida$ColorPrimario))
sexos<-as.data.frame(table(MarcaPreferida$Genero))
EXPLICACIÓN:
Podemos observar en mediante este gráfico de barras la marca “Parx” en MYNTRA es la preferida de los clientes siendo un total de 112 veces pedido
range(as.double(as.character(precio$Var1)))
## [1] 4.188 11.748
print(color)
## Var1 Freq
## 1 Beige 1
## 2 Black 1
## 3 Blue 55
## 4 Brown 2
## 5 Green 6
## 6 Grey 9
## 7 Khaki 3
## 8 Maroon 4
## 9 No color 1
## 10 Pink 5
## 11 Purple 1
## 12 Red 12
## 13 White 10
## 14 Yellow 2
print(sexos)
## Var1 Freq
## 1 Men 112
Podemos concluir que los hombres que prefieren la marca “Parx”, compran sus productos a precios entre 4.188 y 11.748, a la mayoría de dicha población les gusta el azul, pero que tambien escogen una gran variedad de colores.
La moda del género
result <- mlv(dataMuestra$Genero,method="mfv")
print(result)
## [1] "Men" "Women"
Podemos observar que la variable “Genero” es bimodal, ya que posee como a “Men” y “Women” como resultado de su moda.
tablaGenero<-table(dataMuestra$Genero)
maxGenero<-max(table(dataMuestra$Genero))
# Convertir la tabla en un dataframe
tabla_df <- as.data.frame(tablaGenero)
# Acceder al conteo
conteo <- tabla_df$Freq
# Definir el valor umbral para cambiar el color de la barra
ggplot(tabla_df,aes(x=tabla_df$Var1,y=tabla_df$Freq)) +
geom_bar(stat = "identity", fill = ifelse(conteo == maxGenero, "green", "blue")) +
labs(x = "Genero", y = "Cant. Apariciones") +
ggtitle("Gráfico de barras-Genero") +
theme_minimal()
## Warning: Use of `tabla_df$Var1` is discouraged.
## ℹ Use `Var1` instead.
## Warning: Use of `tabla_df$Freq` is discouraged.
## ℹ Use `Freq` instead.
EXPLICACIÓN:
Con este diagrama de barras se puede observar con mejor detenimiento como es que se distribuye la variable “Genero”, también podemos observar que la menor variable de apariciones es “Girls”. Por lo que podemos concluir que los productos en MYNTRA están más enfocados para “Men” y “Woman”, además de que “Girls” no es tan demandado en temas de “ropa de moda”.
La media de precios de la empresa en USD
mean(dataMuestra$PrecioUSD)
## [1] 20.80039
La variable “PrecioUSD” tiene un promedio de 20.80039, pero esta información no puede ser muy confiable ya que existen formas de dar falsa información.
La mediana de precios de la empresa en USD
MedianaPrecio<-median(dataMuestra$PrecioUSD)
print(MedianaPrecio)
## [1] 10.788
Podemos observar que la tendencia central en la variable “PrecioUSD” es de 10.788 dolares.
La moda de precios de la empresa en USD
getmode <- function(mod) {
uniqv <- unique(mod)
uniqv[which.max(tabulate(match(mod, uniqv)))]
}
mod <- dataMuestra$PrecioUSD
result <- getmode(mod)
print(result)
## [1] 8.388
cantResult=max(table(mod))
print(cantResult)
## [1] 63
Podemos observar que el precio 8.388 en la variable “PrecioUSD” es el que más se repite, siendo un total de 63 veces.
tablaPrecio<-table(dataMuestra$PrecioUSD)
tabla_df <- as.data.frame(tablaPrecio)
maxCantPrecio<-max(tablaPrecio)
conteo<-tabla_df$Freq
# Acceder al conteo
plot(tabla_df,aes(x=tabla_df$Var1,y=tabla_df$Freq),main="Rango de los precios",col="red",xlab="PreciosUSD",ylab="Cant. Apariciones")+
geom_line(stat = "identity", fill = ifelse(conteo == maxCantPrecio, "green", "blue"))
## Warning in geom_line(stat = "identity", fill = ifelse(conteo == maxCantPrecio, :
## Ignoring unknown parameters: `fill`
## NULL
EXPLICACION:
Podemos observar de mejor manera como se distribuyen los precios respecto a sus apariciones, notando de que la cantidad de más apariciones es del precio 8.38 con un total de 63 veces además de que los precios menos 25 dolares son la preferencia de los clientes.
El rango de los precios
rango<-range(dataMuestra$PrecioUSD)
print("inicia en:")
## [1] "inicia en:"
print(rango[1])
## [1] 3.108
print("termina en:")
## [1] "termina en:"
print(rango[2])
## [1] 373.2
Los valores en la variable “PrecioUSD” están en un rango entre 3.108 y 373.2.
hist(dataMuestra$PrecioUSD,col=c("red","blue","yellow","pink"),main="Histograma de precios",xlab="Precios en USD", ylab= "Cantidad")
EXPLICACIÓN:
Se puede observar de mejor manera como la mayor cantidad de apariciones en los precios son inferiores a los 50 dolares aproximadamente, y que los precios con menos apariciones son mayores a 100 dolares proximadamente. Concluyendo que los clienetes prefieren los productos más baratos a 50 dolares.
El rango intercuartil de precios
Q1=quantile(dataMuestra$PrecioUSD,0.25)#Q1
Q3=quantile(dataMuestra$PrecioUSD,0.75)#Q1
Q3-Q1
## 75%
## 11.76
#segunda forma
IQR(dataMuestra$PrecioUSD)
## [1] 11.76
boxplot(dataMuestra$PrecioUSD,col=c('yellow'),horizontal = T,main="Rango de precios USD")
EXPLICACIÓN:
En esta boxplot podemos observar que es sesgado a la derecha con valores menores a 50 dolares, con n datos atípicos y que su su mediana está alrededor de los 25 dolares aproximadamente. Podemos concluir que la parte más corta es inferior a la mediana, y la media es mayor a la mediana.
La desviacion estandar
sd(dataMuestra$PrecioUSD)#cuanto se dispersa el precio con respecto al promedio
## [1] 34.85258
La varianza del precio
var(dataMuestra$PrecioUSD)
## [1] 1214.702
El coeficiente de variación del precio
coef_var <- function(cv, na.rm = TRUE) {
sd(cv, na.rm=na.rm) / mean(cv, na.rm=na.rm)
}
cv <- dataMuestra$PrecioUSD
print(coef_var(cv))
## [1] 1.675573
La moda de las imagenes
getmode <- function(mod) {
uniqv <- unique(mod)
uniqv[which.max(tabulate(match(mod, uniqv)))]
}
mod <- dataMuestra$NumImagenes
result <- getmode(mod)
print(result)
## [1] 5
boxplot(dataMuestra$NumImagenes,horizontal = T,col="skyblue",main="Numero de Img")
print("Promedio:")
## [1] "Promedio:"
mean(dataMuestra$NumImagenes)
## [1] 4.607
print("Mediana:")
## [1] "Mediana:"
median(dataMuestra$NumImagenes)
## [1] 5
EXPLICACIÓN:
Podeos observar que tambien presenta datos atípicos, pero algo curioso pasa en este boxplot, podemos ver que la mediana, media y la moda es aproximadamente 5, es decir podemos concluir que la distribución es simétrica.
tablaImagenes<-table(mod)
barplot(tablaImagenes,col=c('red','blue','pink','yellow','brown','skyblue','lightgreen'),main="Diagra de barras de Num. Imagenes")
> ## EXPLICACIÓN:
De una mejor manera podemos observar como es que las cantidades de los precios es que se encuentran. Con ello podemos concluir que las empresas con mayor éxito solo necesitan 5 imágenes para captar la atención del cliente.
Identificar el producto más caro
max(dataMuestra$PrecioUSD)
## [1] 373.2
productoCaro<-dataMuestra%>%
filter(dataMuestra$PrecioUSD==max(dataMuestra$PrecioUSD))
productoCaro
El producto más caro es de la marca “DKNY” para los generos de “Unisex” con un precio de 373.2 dolares.
Identificar los colores más repetidos que llevan el aumento de precio
Modcolor<-getmode(dataMuestra$ColorPrimario)
print(Modcolor)
## [1] "Blue"
preguntaColor<-dataMuestra %>%
filter(dataMuestra$ColorPrimario==Modcolor)
ModPrecioColor<-getmode(preguntaColor$PrecioUSD)
print(ModPrecioColor)
## [1] 8.388
cantResultColor<-max(table(preguntaColor$PrecioUSD))
barplot(table(preguntaColor$PrecioUSD), col= ifelse(table(preguntaColor$PrecioUSD)==cantResultColor,"red","green"), main="Diagrama de barras de los precios para los colores preferidos")
range(preguntaColor$PrecioUSD)
## [1] 3.192 67.188
MasCaro<-preguntaColor%>%
filter(preguntaColor$PrecioUSD==max(preguntaColor$PrecioUSD))
print(MasCaro)
## # A tibble: 1 × 8
## ProductoId NombreProducto Marca…¹ Genero Preci…² NumIm…³ Descr…⁴ Color…⁵
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 10015921 Raymond Men Blue Se… Raymond Men 67.2 5 Blue s… Blue
## # … with abbreviated variable names ¹MarcaProducto, ²PrecioUSD, ³NumImagenes,
## # ⁴Descripción, ⁵ColorPrimario
EXPLICACIÓN:
Podemos observar que el color azul es el más preferido de las empresas, también que su precio más repetido es de 8.388, y se encuentra en un rango de 67.188, además de que observamos de que el producto más caro con un precio de 67.188, que es destinado a los hombre, es para la marca Raymond.
Con lo que podemos concluir que al alza de precio para los colores más caros, depende de la “Marca” y para el “Cliente”.
Cuales son los precios más caros para los Varones
table(dataMuestra$Genero)
##
## Boys Girls Men Unisex Women
## 63 43 373 148 373
preguntaBoys<- dataMuestra %>%
filter(dataMuestra$Genero=='Boys')
MaxBoys=max(preguntaBoys$PrecioUSD)
print('Precio maximo para Boys:')
## [1] "Precio maximo para Boys:"
print(MaxBoys)
## [1] 20.388
preguntaMen<- dataMuestra %>%
filter(dataMuestra$Genero=='Men')
MaxMens=max(preguntaMen$PrecioUSD)
print('Precio maximo para Men:')
## [1] "Precio maximo para Men:"
print(MaxMens)
## [1] 79.788
TotalVarones=MaxBoys+MaxMens
print('Precio total:')
## [1] "Precio total:"
print(TotalVarones)
## [1] 100.176
Cuales son los precios más caros para las Damas
table(dataMuestra$Genero)
##
## Boys Girls Men Unisex Women
## 63 43 373 148 373
preguntaGirls<- dataMuestra %>%
filter(dataMuestra$Genero=='Girls')
MaxGirls=max(preguntaGirls$PrecioUSD)
print('Precio maximo para Girls:')
## [1] "Precio maximo para Girls:"
print(MaxGirls)
## [1] 45.6
preguntaWomen<- dataMuestra %>%
filter(dataMuestra$Genero=='Women')
MaxWomen=max(preguntaWomen$PrecioUSD)
print('Precio maximo para Women: ')
## [1] "Precio maximo para Women: "
print(MaxWomen)
## [1] 133.644
TotalDamas=MaxGirls+MaxWomen
print('Precio total: ')
## [1] "Precio total: "
print(TotalDamas)
## [1] 179.244
if (TotalDamas>TotalVarones){
print("Las Damas tienen precio más caro con una diferencia de ")
print(TotalDamas-TotalVarones)
}else{
print("Los Varones tienen precio más caro con una diferencia de ")
print(TotalVarones-TotalDamas)
}
## [1] "Las Damas tienen precio más caro con una diferencia de "
## [1] 79.068
El rango de los precios según el genero de la ropa
ggplot(data = dataMuestra, aes(x = dataMuestra$Genero, y = dataMuestra$PrecioUSD, fill = dataMuestra$Genero)) +
geom_boxplot() +
labs(title = "Relación entre el Precio y el Género de la Ropa",
x = "Género",
y = "Precio",
fill = "Género") +
theme_minimal()
## Warning: Use of `dataMuestra$Genero` is discouraged.
## ℹ Use `Genero` instead.
## Warning: Use of `dataMuestra$PrecioUSD` is discouraged.
## ℹ Use `PrecioUSD` instead.
## Warning: Use of `dataMuestra$Genero` is discouraged.
## ℹ Use `Genero` instead.
La cantidad de ropa Unisex que saca cada marca
dataHombres <- dataMuestra %>% filter(Genero == "Unisex")
ggplot(data = dataHombres, aes(x = dataHombres$MarcaProducto, fill = dataHombres$Genero)) +
geom_bar(position="dodge") +
labs(title = "Relación entre la Marca y el Género de la Ropa",
x = "Marca",
y = "Conteo",
fill = "Género") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90))
## Warning: Use of `dataHombres$MarcaProducto` is discouraged.
## ℹ Use `MarcaProducto` instead.
## Warning: Use of `dataHombres$Genero` is discouraged.
## ℹ Use `Genero` instead.
mosaico!! Ronaldinho.